{
    function test(x, y = 'world') {
        console.log('默认值', x, y);
    }
    test('hello');
    test('hello', 'kill');
}

{

    let x = 'test';
    let z = "testz"
    function test2(x, y = x, c = z) {
        let z = "dsfasfas"
        // y使用的是传入的x, c使用的是全局z
        console.log('作用域', x, y, c); // kill kill testz
    }
    test2('kill');
}

{
    // ...arg 相当于吧 arguments 拆开; 
    //  ...把数组拆开(PS:数组是存放元素集合的一个容器，而使用扩展运算符可以将这个容器拆开，这样就只剩下元素集合)
    function test3(...arg) {
        console.log(arg)
        for (let v of arg) {
            console.log('rest', v);
        }
    }
    test3(1, 2, 3, 4, 'a');
    console.log(...[1, 2, 4]);
    console.log('a', ...[1, 2, 4]);
}


{
    // 箭头函数
    let arrow = v => v * 2;
    let arrow2 = () => 5;
    let arrow3 = (v = 2) => { let vTemp = 10 + v; return vTemp; };
    console.log('arrow', arrow(3));
    console.log(arrow2(), "===arrow3===", arrow3(5));
}

{
    // 尾调用: 尾调用的概念非常简单，一句话就能说清楚，就是指某个函数的最后一步是调用另一个函数。
    // 尾调用优化 - http://www.ruanyifeng.com/blog/2015/04/tail-call.html
    function tail(x) {
        console.log('tail', x);
    }
    function fx(x) {
        return tail(x)
    }
    fx(123)
}